package ysq.xyg.sys.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.StringUtil;
import org.apache.commons.collections.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import tk.mybatis.mapper.entity.Example;
import ysq.xyg.base.model.dto.ReturnEntity;
import ysq.xyg.base.service.impl.BaseServiceImpl;
import ysq.xyg.base.util.BaseConstant;
import ysq.xyg.base.util.BaseUtil;
import ysq.xyg.base.util.FileUtil;
import ysq.xyg.sys.dao.SysFileDao;
import ysq.xyg.sys.model.po.SysFile;
import ysq.xyg.sys.model.po.SysUser;
import ysq.xyg.sys.model.vo.SysFileVo;
import ysq.xyg.sys.service.SysFileService;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * 系统管理-附件管理service实现
 *
 * @author shengQiang yu
 * @date 2019-3-30 13:46:37
 */
@Service("sysFileService")
public class SysFileServiceImpl extends BaseServiceImpl<SysFile> implements SysFileService {

    @Resource
    private SysFileDao sysFileDao;

    private SysFile sysFile;

    @Autowired
    public void setBaseDao(SysFileDao sysFileDao) {
        this.baseDao = sysFileDao;
    }


    /**
     * 分页查询
     *
     * @param sysFileVo 对象
     * @param pageSize 展示数量
     * @param pageNum 当前页面
     * @return ReturnEntity 对象
     * @author shengQiang yu
     * @date 2019-3-30 13:46:37
     */
    public ReturnEntity page(SysFileVo sysFileVo, int pageSize, int pageNum) {
        PageHelper.startPage(pageNum,pageSize);
        PageHelper.orderBy(" update_time desc");
        List<SysFile> list = acceptList(sysFileVo);
        PageInfo<SysFile> page=new PageInfo<SysFile>(list);
        return new ReturnEntity(page.getList(),page.getTotal(),page.isHasNextPage());
    }

    /**
     * 修改
     *
     * @param sysFileVo 对象
     * @param currentUser 当前用户
     * @return ReturnEntity 对象
     * @author shengQiang yu
     * @date 2019-3-30 13:46:37
     */
    public ReturnEntity addOrUpdate(SysFileVo sysFileVo, SysUser currentUser) {
        boolean isUpate=true;
        if(StrUtil.isEmpty(sysFileVo.getId())){
            sysFile=new SysFile(currentUser);
            isUpate=false;
        }else{
            sysFile=selectByPrimaryKey(sysFileVo.getId());
            if(ObjectUtil.isNull(sysFile)){
                return new ReturnEntity(BaseConstant.FAIL,BaseConstant.DO_FAIL);
            }
            sysFile.setUpdateTime(new Date());
            sysFile.setUpdateUser(currentUser.getId());
        }
                sysFile.setFileName(sysFileVo.getFileName());
                sysFile.setFileSize(sysFileVo.getFileSize());
                sysFile.setExtendName(sysFileVo.getExtendName());
                sysFile.setFileTag(sysFileVo.getFileTag());
                sysFile.setFileSaveType(sysFileVo.getFileSaveType());
                sysFile.setPath(sysFileVo.getPath());
        int num=0;
        if(isUpate){
            num=updateByPrimaryKey(sysFile);
        }else{
            num=insert(sysFile);
        }
        if(num<=0){
            return new ReturnEntity(BaseConstant.FAIL,BaseConstant.DO_FAIL);
        }
        return new ReturnEntity();
    }
    /**
     * 删除
     *
     * @param id 主键id
     * @param currentUser 当前用户
     * @return ReturnEntity 对象
     * @author shengQiang yu
     * @date 2019-3-30 13:46:37
     */
    public ReturnEntity delete(String id, SysUser currentUser) {
        SysFile sysFile=selectByPrimaryKey(id);
        if(sysFile!=null){
            sysFile.setRemoveTag(BaseConstant.BASE_REMOVE_TAG_DELETE);
            sysFile.setUpdateTime(new Date());
            sysFile.setUpdateUser(currentUser.getId());
            int num=updateByPrimaryKey(sysFile);
            if(num>0){
                return new ReturnEntity();
            }
        }
        return new ReturnEntity(BaseConstant.FAIL,BaseConstant.DO_FAIL);
    }

    /**
     * 获取集合
     *
     * @param sysFileVo 对象
     * @return List<BaseDict> BaseDict集合
     * @author shengQiang yu
     * @date 2019-3-30 13:46:37
     */
    public List<SysFile> acceptList(SysFileVo sysFileVo){
        Example example = new Example(SysFile.class);
        Example.Criteria criteria = example.createCriteria();
        if(StringUtil.isNotEmpty(sysFileVo.getRemoveTag())){
            criteria.andEqualTo("removeTag",sysFileVo.getRemoveTag());
        }
        example.setOrderByClause(" update_time desc");
        return sysFileDao.selectByExample(example);
    }
    /**
     * 文本编辑器附件上传
     *
     * @param file     文件对象
     * @param request  请求
     * @param catalog  文件保存自定义目录
     * @return
     * @Author: shengQiang yu
     * @Date: 2018-12-04 10:40
     */
    @Override
    public ReturnEntity layEditUpload(MultipartFile file, HttpServletRequest request, String catalog) {
        // 文件原名称
        String fileName=file.getOriginalFilename();
        ReturnEntity returnEntity=fileUpload(file,request,catalog,"");
        if(BaseConstant.SUCCESS==returnEntity.getCode()){
            Map<String, String> data = new HashedMap();
            data.put("src",returnEntity.getData().toString());
            data.put("title",fileName);
            return new ReturnEntity(data);
        }
        return returnEntity;
    }

    /**
     * 附件下载
     *
     * @param id 附件id
     * @param response HttpServletResponse对象
     * @param request HttpServletRequest对象
     * @return
     * @author shengQiang yu
     * @date 2019-03-07 17:10
     */
    public void download(HttpServletResponse response, HttpServletRequest request, String id) {
        SysFile sysFile =sysFileDao.selectByPrimaryKey(id);
        if(sysFile!=null){
            OutputStream outputStream = null;
            FileInputStream inputStream = null;
            try {
                response.setContentType("application/force-download");// 设置强制下载不打开
                String filenamereal= sysFile.getFileName();
                response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filenamereal,"utf-8"));
                outputStream = response.getOutputStream();
                String fileSaveType = sysFile.getFileSaveType();
                //本地服务器存储类型
                String path = sysFile.getPath();
                String fileName = sysFile.getFileName();
                String absoluteAdress = FileUtil.acceptRealPath(request) + path;
                inputStream = new FileInputStream(absoluteAdress);
                byte[] buffer=new byte[1024];
                int len=-1;
                StringBuffer sb=new StringBuffer();
                while ((len=inputStream.read(buffer))!=-1){
                    outputStream.write(buffer,0,len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (outputStream != null) {
                        outputStream.close();
                    }
                    if (inputStream != null) {
                        outputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     *@Author: YuShengQiang
     *@Date: 2018-12-04 10:40
     *@Description:附件上传
     * @param file 文件对象
     * @param request 请求
     * @param catalog 文件保存自定义目录
     * @param objectId 文件保存objectId，空为自定义
     * @param requestFileType 文件要求类型：1、图片 ，空为不做要求
     * @param isSave 是否保存到数据库：1、是，2、否
     * @param sysUser 当前操作用户信息
     * @return
     */
    public ReturnEntity fileUpload(MultipartFile file, HttpServletRequest request, String catalog, String requestFileType, String objectId,String isSave, SysUser sysUser){
        ReturnEntity returnEntity=fileUpload(file,request,catalog,requestFileType);
        if(BaseConstant.SUCCESS==returnEntity.getCode() && "1".equals(isSave)){
            // 文件原名称
            String fileName=file.getOriginalFilename();
            //文件类型
            String type= BaseUtil.acceptFileType(fileName);
            SysFile sysFile=new SysFile();
            sysFile.setId(BaseUtil.uId());
            sysFile.setFileName(fileName);
            sysFile.setFileSize(file.getSize());
            sysFile.setExtendName(type);
            sysFile.setFileTag(StrUtil.isNotEmpty(objectId)?objectId: BaseUtil.uId());
            sysFile.setFileSaveType(BaseConstant.SYS_FILE_SAVE_TYPE_LOCALHOST);
            sysFile.setPath(returnEntity.getData().toString());
            sysFile.setCatalog(catalog);
            sysFile.setCreateUser(sysUser.getId());
            sysFile.setRemoveTag(BaseConstant.BASE_REMOVE_TAG_NORMAL);
            sysFile.setCreateTime(new Date());
            sysFile.setUpdateUser(sysUser.getId());
            sysFile.setUpdateTime(new Date());
            //插入到数据库
            int id=sysFileDao.insert(sysFile);
            if(id>0){
                return new ReturnEntity(sysFile);
            }else{
                return new ReturnEntity(BaseConstant.FAIL, BaseConstant.DO_FAIL);
            }
        }else{
            return returnEntity;
        }

    }

    /**
     *@Author: YuShengQiang
     *@Date: 2018-12-04 10:40
     *@Description:附件上传
     * @param file 文件对象
     * @param request 请求
     * @param catalog 文件保存自定义目录
     * @param requestFileType 文件要求类型：1、图片 ，空为不做要求
     * @return
     */
    protected ReturnEntity fileUpload(MultipartFile file, HttpServletRequest request, String catalog, String requestFileType){
        // 文件原名称
        String fileName=file.getOriginalFilename();
        //文件类型
        String type= BaseUtil.acceptFileType(fileName);
        //判断是否有文件类型要求
        if(StringUtil.isNotEmpty(requestFileType)){
            if(BaseConstant.FILE_TYPE_IMAGE.equals(requestFileType)){
                //图片文件
                if(!BaseUtil.fileCheckImg(type)){
                    return new ReturnEntity(BaseConstant.FAIL,BaseConstant.DO_FAIL_FILE);
                }
            }else if(BaseConstant.FILE_TYPE_EXECL.equals(requestFileType)){
                //文档文件
                if(!BaseUtil.fileCheckExecl(type)){
                    return new ReturnEntity(BaseConstant.FAIL,BaseConstant.DO_FAIL_FILE);
                }
            }
        }
        // 项目在容器中实际发布运行的根路径
        String realPath= FileUtil.acceptRealPath(request);
        // 自定义的文件名称
        String  newFileName = BaseUtil.acceptFileName(type);
        // 相对目录
        String  realDir = "upload";
        if(StrUtil.isNotEmpty(catalog)){
            realDir+="/"+catalog.trim();
        }
        //获取目录
        String dir= BaseUtil.acceptFileDir(realPath,realDir);
        // 转存文件到指定的路径
        try {
            file.transferTo(new File(dir,newFileName));
        } catch (IOException e) {
            return new ReturnEntity(BaseConstant.FAIL,BaseConstant.DO_FAIL);
        }
        return new ReturnEntity("/"+realDir+"/"+newFileName);

    }
}
